package com.ctsi.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ctsi.common.util.Search;
import com.ctsi.core.common.entity.LoginUser;
import com.ctsi.core.common.entity.MarsDS;
import com.ctsi.system.dto.UserInfo;
import com.ctsi.system.dto.UserPwdReqDTO;
import com.ctsi.system.dto.UserReqDTO;
import com.ctsi.system.entity.User;
import com.ctsi.system.vo.FlowUserVO;
import com.ctsi.system.vo.UserResVO;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * <p>
 * 系统用户表 服务类
 * </p>
 *
 * @author wang xiao xiang
 */
public interface IUserService extends IService<User> {

    /**
     * 分页业务方法
     *
     * @param search 搜索参数
     * @param user   用户信息
     * @return IPage
     */
    IPage<User> listPage(MarsDS marsDS, User user, Search search);

    /**
     * 查询用户信息
     *
     * @param userId 用户Id
     * @return 用户信息
     */
    UserResVO detail(Long userId);

    /**
     * 拥有角色
     *
     * @param user 用户ID
     * @return 角色id集合
     */
    List<String> getRole(User user);

    /**
     * 修改用户状态
     *
     * @param user 用户参数，主要包括Id和status
     * @return 更新状态
     */
    boolean setStatus(User user);


    /**
     * 设置用户角色数据
     *
     * @param userId          用户ID
     * @param grantRoleIdList 权限列表
     * @return boolean
     */
    boolean setRole(Long userId, List<Long> grantRoleIdList);

    /**
     * 保存或更新用户
     *
     * @param userReq 用户请求对象
     * @return boolean
     */
    boolean setUser(UserReqDTO userReq);

    /**
     * 修改密码
     *
     * @param userPwdReq 密码请求对象
     * @return 是否修改成功
     */
    boolean setPassword(UserPwdReqDTO userPwdReq);

    /**
     * 批量删除用户信息
     *
     * @param ids id列表
     * @return boolean
     */
    boolean delUser(List<Long> ids);

    /**
     * 设置用户头像
     *
     * @param user 用户信息
     * @return 更新状态
     */
    boolean setAvatar(User user);

    /**
     * 获取工作流要求的用户列表
     *
     * @return 用户列表对象
     */
    List<FlowUserVO> getFlowUserList();

    UserInfo getUserInfo(User user);

    LoginUser getLoginUserByRequest(Long userId, HttpServletRequest request);
}
